﻿using System;
using System.Data;
using System.Configuration; 
using System.Data.SqlClient;                                                                                //包含访问SQL Server所需的各类对象；
using System.Drawing;
using System.Windows.Forms;

namespace 住院医生工作站
{

    public partial class Form1 : Form
    {

        /// <summary>
       
        /// </summary>
        private DataTable MedicineTable;

        /// <summary>

        
       
        /// </summary>
        private DataView MedicineViewByName;

        /// <summary>
        /// 公有方法：构造函数；
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.CenterScreen;                                            //本窗体启动位置设为屏幕中央； 
            this.dgv_Medicine.AllowUserToAddRows = false;                                                     //数据网格视图不允许用户添加行；
            this.dgv_Medicine.RowHeadersVisible = false;                                                      //数据网格视图的行标题不可见；
            this.dgv_Medicine.BackgroundColor = Color.White;                                                  //数据网格视图的背景色设为白色；
            this.dgv_Medicine.AutoSizeColumnsMode =
                DataGridViewAutoSizeColumnsMode.AllCells;                                                   //数据网格视图的自动调整列宽模式设为显示所有单元格；
        }

        /// <summary>
        /// 私有方法：点击载入按钮；
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Load_Click(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString =
              ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;                             //在字符串变量中，描述连接字符串所需的服务器地址、数据库名称、集成安全性（即是否使用Windows验证）；
            SqlCommand sqlCommand = new SqlCommand();                                                       //声明并实例化SQL命令；
            sqlCommand.Connection = sqlConnection;                                                          //将SQL命令的连接属性指向SQL连接；
            sqlCommand.CommandText = "SELECT * FROM tb_Medicine;";                                            //指定SQL命令的命令文本；该命令查询所有课程，以用作数据网格视图数据源；
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                           //声明并实例化SQL数据适配器；
            sqlDataAdapter.SelectCommand = sqlCommand;                                                      //将SQL数据适配器的查询命令属性指向SQL命令；
            sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;                            //设置SQL数据适配器在缺少架构时的动作为追加主键，从而获取数据库中定义的主键，否则无法根据编号搜索课程；
            this.MedicineTable = new DataTable();                                                             //实例化本窗体的课程数据表，用于保存所有课程，以用作数据网格视图数据源；
            sqlConnection.Open();                                                                           //打开SQL连接；
            sqlDataAdapter.Fill(this.MedicineTable);                                                          //SQL数据适配器读取数据，并填充课程数据表；
            sqlConnection.Close();                                                                                                                         //借助本窗体的课程数据表的方法Copy来复制数据表，并赋予本窗体的先修课程数据表，用作先修课程下拉框的数据源；
            this.MedicineViewByName = new DataView();
            this.MedicineViewByName.Table = this.MedicineTable;                                                 //设置课程数据视图对应的数据表；
            this.MedicineViewByName.Sort = "MedicineName ASC";                                                        //设置课程数据视图的排序条件，即查询所覆盖的列；
            this.dgv_Medicine.Columns.Clear();                                                                //数据网格视图的列集合清空；
            this.dgv_Medicine.DataSource = this.MedicineTable;                                                  //将数据网格视图的数据源设为学生数据表；
            this.dgv_Medicine.Columns["No"].HeaderText = "编号";                                              //将数据网格视图的指定列的表头文本设为中文；
            this.dgv_Medicine.Columns["MedicineName"].HeaderText = "药品名称";
            this.dgv_Medicine.Columns["MedicinePrice"].HeaderText = "药品价格";
            this.dgv_Medicine.Columns["Solution"].HeaderText = "使用方法";
            this.dgv_Medicine.Columns["Speed"].HeaderText = "用药间隔";
            this.dgv_Medicine.Columns["Pinyin"].Visible = false;                                              //将数据网格视图的指定列设为不可见；
                 
        }

        

        private void btn_SearchByNo_Click_1(object sender, EventArgs e)
        {
            DataRow searchResultRow = this.MedicineTable.Rows.Find(this.txb_MedicineNo.Text.Trim());            //借助本窗体的课程数据表的行集合的方法Find，根据主键值（即课程编号）快速查找相应课程，并返回其所在的数据行；但数据行不能作为数据源，需另行创建数据表，并导入该数据行，最后将数据表作为数据源；
            DataTable searchResultTable = this.MedicineTable.Clone();                                         //借助本窗体的课程数据表的方法Clone，创建相同架构的空表，用于保存搜索结果所在数据行；
            searchResultTable.ImportRow(searchResultRow);                                                   //将（复制后的）数据行导入数据表；
            this.dgv_Medicine.DataSource = searchResultTable;      
        }

        private void btn_SearchByName_Click_1(object sender, EventArgs e)
        {
            DataRowView[] searchResultRowViews =
               this.MedicineViewByName.FindRows(this.txb_MedicineName.Text.Trim());                            //借助本窗体的按名称排序的课程数据视图的方法FindRows，根据排序列（即课程名称）快速查找相应课程；由于该列并非主键，可能返回多行查询结果，故返回数据行视图数组；数据行视图数组不能直接作为数据源，需转为列表后方可作为数据源；
            DataTable searchResultTable = this.MedicineTable.Clone();                                         //借助本窗体的课程数据表的方法Clone，创建相同架构的空表，用于保存搜索结果所在数据行；
            foreach (DataRowView dataRowView in searchResultRowViews)                                       //遍历搜索结果所在数据行视图数组；
            {
                searchResultTable.ImportRow(dataRowView.Row);                                               //通过每条数据行视图的属性Row获取相应的数据行，并导入数据表；
            }
            this.dgv_Medicine.DataSource = searchResultTable;   
        }

        private void txb_Pinyin_TextChanged_1(object sender, EventArgs e)
        {
            DataRow[] searchResultRows =
                this.MedicineTable.Select("Pinyin LIKE '%" + this.txb_Pinyin.Text.Trim() + "%'");             //借助本窗体的课程数据表的方法Select，并提供与SQL类似的谓词表达式作为查询条件，根据拼音缩写进行模糊查询（仅支持%通配符）；查询将返回数据行数组；
            DataTable searchResultTable = this.MedicineTable.Clone();                                         //借助本窗体的课程数据表的方法Clone，创建相同架构的空表，用于保存搜索结果所在数据行；
            foreach (DataRow row in searchResultRows)                                                       //遍历搜索结果所在数据行数组；
            {
                searchResultTable.ImportRow(row);                                                           //数据行导入数据表；
            }
            this.dgv_Medicine.DataSource = searchResultTable;   
        }
    }
}
